package com.example.study_thread.i_synchronized;

public class MyTicket implements Runnable {
    //    定义100张票
    static int ticket = 100;

    //    任意new一个对象
    Object obj = new Object();

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(100L);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            myMethod4();
//            myMethod3();
//            myMethod1();  // 默认锁是this
//            myMethod2();
//            synchronized (obj) {
////                线程安全问题代码
//                if (ticket > 0) {
//                    System.out.println(Thread.currentThread().getName() + "买了第" + ticket + "张票");
//                    ticket--;
//                }
//            }
        }
    }

//    同步方法
//    public synchronized void myMethod1() {
////   线程安全问题代码
//        if (ticket > 0) {
//            System.out.println(Thread.currentThread().getName() + "买了第" + ticket + "张票");
//            ticket--;
//        }
//    }

//    public void myMethod2() {
//        synchronized(this) {
//            System.out.println("this...." + this);
//            //   线程安全问题代码
//            if (ticket > 0) {
//                System.out.println(Thread.currentThread().getName() + "买了第" + ticket + "张票");
//                ticket--;
//            }
//        }
//    }

//    public static synchronized void myMethod3() {
////   线程安全问题代码
//        if (ticket > 0) {
//            System.out.println(Thread.currentThread().getName() + "买了第" + ticket + "张票");
//            ticket--;
//        }
//    }

    public static void myMethod4() {
        synchronized (MyTicket.class) {
//            System.out.println("this...." + MyTicket.class);
            //   线程安全问题代码
            if (ticket > 0) {
                System.out.println(Thread.currentThread().getName() + "买了第" + ticket + "张票");
                ticket--;
            }
        }
    }
}
